#ifndef __STRATEGY_
#define __STRATEGY_

#include <memory>
#include "Detector.h"
#include "Parameter.h"
#include <opencv2/opencv.hpp>

class Strategy;
using p_strategy = std::shared_ptr<Strategy>;

constexpr float PI = 3.1415926536;

// 欧拉角
typedef struct
{
    float yaw;
    float pitch;
    inline void clear()
    {
        this->yaw = 0.f;
        this->pitch = 0.f;
    };
} eulerAngle;

class Strategy
{
public:
    Strategy() = default;
    ~Strategy(){};

    // 决策器执行分析
    void analysis(std::vector<Object>);
    // 获取决策器分析得到的目标
    inline Object getGoal() { return this->_goal; };
    // 作为函数指针用来输出信息用
    void info();

public:
    // 发现目标标志位
    bool isDiscover = false;

private:
    // 对象分类
    void _classific();
    // 获得目标
    Object _obtainGoal();
    // 计算相对角度
    eulerAngle _calcRelativeAngle(const cv::Mat &, const cv::Point2f &);
    // 计算世界坐标系坐标
    void _calcObjectCoor(const eulerAngle &, const uint16_t &);

private:
    // 目标番茄
    Object _goal;
    // 目标二维欧拉角
    eulerAngle _eulerAngle;
    // 目标世界坐标系坐标
    cv::Point3f _goalObjectCoor;
    // 检测到的对象集合
    std::vector<Object> _objects;
    // 成熟番茄
    std::vector<Object> _Mature;
    // 中熟番茄
    std::vector<Object> _Midmature;
    // 青涩番茄
    std::vector<Object> _Immature;
};

#endif